package com.clicacao.clicacao;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.clicacao.library.ClicacaoFunctions;
import com.clicacao.library.DatabaseHandler;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;

public class UserUpisScreen extends Activity {
	
	//Variaveis para manipulacao de nomes de arquivos
	String mediaDir;
	String mediaPath;
	String tipo_upi;
	File media;
	MediaPlayer mediaPlayer;
	
	HashMap<String, String> usuario;
	ListView listView;
	Context context;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.user_upis_screen);
		
		usuario = new HashMap<String, String>();
		DatabaseHandler db = new DatabaseHandler(getApplicationContext());
		usuario = db.getUserDetails();
		
		//Salvando o contexto atual do sistema
		context = this;
		
		//Inicializando o listview
		listView = (ListView)findViewById(R.id.lsvUpisUsuario);
		
		new AsyncTask<Void, Void, JSONObject>(){
			
			ClicacaoFunctions clicacaoFunctions;
			String umid = usuario.get("id_mochila");
			ArrayList<HashMap<String, String>> upilist;
			HashMap<String, String> upi;
			
			
			//private ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());

			@Override
			protected JSONObject doInBackground(Void... params) {
				JSONObject json;
				clicacaoFunctions = new ClicacaoFunctions();
				json = clicacaoFunctions.getUserBagUpis(umid);
				return json;
			}

			@Override
			protected void onPostExecute(JSONObject result) {
				super.onPostExecute(result);
				//Com a resposta json obtida, fazemos o parser para preencher o listview
				try {
					//Confere para ver se o resultado foi positivo
					upilist = new ArrayList<HashMap<String,String>>();
					Log.e("ERRO", "Instanciou novo objeto!");
					if(result.getString("success").equals("1")){
						JSONArray json_upis_array = result.getJSONArray("upi");
						if(json_upis_array.isNull(0)){
							//Nao houve nenhuma UPI do usuario
							Toast.makeText(getApplicationContext(), "Usuario nao possui nenhuma UPI em sua mochila!", Toast.LENGTH_SHORT).show();
						}else{//Preenche o listview
							Integer i = Integer.valueOf(0);
							for(i = 0; i < json_upis_array.length(); i++){
								upi = new HashMap<String, String>();
								JSONObject json_upi = json_upis_array.getJSONObject(i);
								upi.put("tipo_upi", json_upi.getString("tipo_upi"));
								upi.put("texto", json_upi.getString("texto"));
								upi.put("autor", json_upi.getString("autor"));
								upi.put("_id", json_upi.getString("upiid"));
								upilist.add(upi);
							}
						}
					}
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				//Hora de preencher o listview
				//Mas antes confere para ver se upilist possui algum item
				if(!upilist.isEmpty()){
					String campos[] = {"_id", "autor", "texto", "tipo_upi"};
					int layout[] = {R.id.tvIdUpi,
								    R.id.tvAutor, 
								    R.id.tvTitulo, 
								    R.id.tvTipoUpi};
					
					ListAdapter listAdapter = new SimpleAdapter(getApplicationContext(), 
																	upilist, 
																	R.layout.adventure_bag_upi_row, 
																	campos, 
																	layout);					
					try{
						listView.setAdapter(listAdapter);
					}catch(Exception e){
						Log.e("ERRO", "Nao foi possivel inicializar o listview");
						e.printStackTrace();
					}
					
					listView.setLongClickable(true);
					listView.setOnItemLongClickListener(new OnItemLongClickListener() {

						public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
							//Aqui vou visualizar a UPI que esta na lista
							//final AdapterView<?> av = parent;
							//final int positionToDrop = position; 
							
							AlertDialog.Builder adb = new AlertDialog.Builder(context);
							//Log.e("DIALOG", "TESTE");
							adb.setTitle("Colocar UPI no Container");
							adb.setMessage("Deseja colocar a UPI no Container?");
							adb.setNegativeButton("Nao", null);
							adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
								
								public void onClick(DialogInterface dialog, int which) {
									
									/*Agora nao
									//Toast.makeText(getApplicationContext(), "Dropar UPI " + id1, Toast.LENGTH_SHORT).show();
									HashMap<String, String> lista = new HashMap<String, String>();
									lista = (HashMap<String, String>)av.getItemAtPosition(positionToDrop);
									final String upiid = lista.get("_id").toString();
									//Mudando parametros para representar que larguei a UPI na aventura
									//Para isto preciso de uma thread assincrona
									new AsyncTask<Void, Void, JSONObject>(){
										
										ClicacaoFunctions clicacaoFunctions;
										
										@Override
										protected JSONObject doInBackground(
												Void... params) {
											clicacaoFunctions = new ClicacaoFunctions();
											JSONObject json = clicacaoFunctions.dropUpiToAdventure(upiid, aid, latitude, longitude);
											return json;
										}

										@Override
										protected void onPostExecute(
												JSONObject result) {
											//Analisa o JSON para ver se a operacao foi bem sucedida
											super.onPostExecute(result);
											
											try{
												if(result.getString("success").equalsIgnoreCase("1")){
													Toast.makeText(getApplicationContext(), "A UPI foi largada no mapa com sucesso!", Toast.LENGTH_SHORT).show();
												}else{
													Toast.makeText(getApplicationContext(), "Nao foi possivel largar a UPI", Toast.LENGTH_SHORT).show();
												}
											}catch(JSONException e){
												e.printStackTrace();
											}
											
											onDestroy();
										
										}
									
									}.execute();
								*/
								}
							});
							adb.show();
							
							return false;
						}
					
					});
					
					listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

						public void onItemClick(AdapterView<?> parent, View view,
								int position, long id) {

							//Aqui vou visualizar a UPI que esta na lista
							final AdapterView<?> av = parent;
							final int positionToDrop = position;
							
							//Primeiro eu preciso ver se a UPI eh uma foto ou um som
							HashMap<String, String> lista = new HashMap<String, String>();
							lista = (HashMap<String, String>)av.getItemAtPosition(position);
							final String nome_upi = lista.get("texto").toString();
																
							//Inicializando o alert dialog
							AlertDialog.Builder adb = new AlertDialog.Builder(context);
							
							if(nome_upi.startsWith("[FOTO]")){
								tipo_upi = "foto";
								mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/FOTOS/";
								mediaPath = "/www/clicacao/cliente/usuarios/fotos/";
								adb.setTitle("Visualizar FOTO");
								adb.setMessage("Deseja abrir a foto?");
							}else if(nome_upi.startsWith("[SOM]")){
								tipo_upi = "som";
								mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/SONS/";
								mediaPath = "/www/clicacao/cliente/usuarios/sons/";
								adb.setTitle("Ouvir SOM");
								adb.setMessage("Deseja ouvir o som?");
							}
							
							//Analisa se o diretorio existe, senao o cria
							File file  = new File(mediaDir);
							if(!file.exists()){
								file.mkdirs();
							}
							
							adb.setNegativeButton("Nao", null);
							adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog, int which) {
									//Ao clicar em sim inicia o download da imagem via FTP
									//Retorna o caminho para o arquivo no celular
									/*Primeiro vou analisar se a UPI esta no meu celular
									 * Se isto for verdade, basta retornar o caminho e inicializar a visao da UPI
									 * Senaum, preciso ir no servidor buscar o arquivo e entao inicializar nova tela
									 * */
									
									media = new File(mediaDir + nome_upi);
																				
									if(media.exists()){
										//O arquivo existe no celular
										//Basta verificar que tipo de arquivo eh ...
										if(tipo_upi.equals("som")){
											//Inicializa o player
											
											mediaPlayer = new MediaPlayer();
											try {
												mediaPlayer.setDataSource(mediaDir + nome_upi);
												mediaPlayer.prepare();
											} catch (IllegalArgumentException e) {
												e.printStackTrace();
											} catch (SecurityException e) {
												e.printStackTrace();
											} catch (IllegalStateException e) {
												e.printStackTrace();
											} catch (IOException e) {
												e.printStackTrace();
											}
											mediaPlayer.start();
											
											/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
											Uri uri = Uri.parse(mediaDir + nome_upi);
											Intent i = new Intent(Intent.ACTION_VIEW, uri);
											i.setDataAndType(uri, "video/3gpp");
											startActivity(i);
											*/
										}else if(tipo_upi.equals("foto")){
											Intent i = new Intent(UserUpisScreen.this, PhotoScreen.class);
											i.putExtra("mediaPath", mediaDir + nome_upi);
											UserUpisScreen.this.startActivity(i);
										}
									}else{
										//O arquivo nao existe, preciso pega-lo no servidor
										
										new AsyncTask <Void, Void, Boolean>(){
											
											@Override
											protected Boolean doInBackground(
													Void... params) {
												
												FTPClient ftpClient = new FTPClient();
												FileOutputStream fos;
												Boolean result = false;
												
												try{
													ftpClient.connect("ftp.clicacao.com", 21);
													ftpClient.login("clicacao", "liedamadis");
													ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
													ftpClient.enterLocalPassiveMode();
													fos = new FileOutputStream(mediaDir + nome_upi);
													result = ftpClient.retrieveFile(mediaPath + nome_upi, fos);
													fos.close();
													ftpClient.logout();
													ftpClient.disconnect();
												}catch (SocketException e) {
													e.printStackTrace();
												} catch (IOException e) {
													e.printStackTrace();
												}
												
												return result;
											}

											@Override
											protected void onPostExecute(
													Boolean result) {
												super.onPostExecute(result);
												if(result){
													Toast.makeText(getApplicationContext(), "O arquivo foi baixado com sucesso!", Toast.LENGTH_SHORT).show();
													//Depois que o arquivo eh baixado, inicializa a tela de visualizacao ou o player
													if(tipo_upi.equals("som")){
														//Inicializa o player
														
														mediaPlayer = new MediaPlayer();
														try {
															mediaPlayer.setDataSource(mediaDir + nome_upi);
															mediaPlayer.prepare();
														} catch (IllegalArgumentException e) {
															e.printStackTrace();
														} catch (SecurityException e) {
															e.printStackTrace();
														} catch (IllegalStateException e) {
															e.printStackTrace();
														} catch (IOException e) {
															e.printStackTrace();
														}
														mediaPlayer.start();
														
														/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
														Uri uri = Uri.parse(mediaDir + nome_upi);
														Intent i = new Intent(Intent.ACTION_VIEW, uri);
														i.setDataAndType(uri, "video/3gpp");
														startActivity(i);
														*/
														
													}else if(tipo_upi.equals("foto")){
														Intent i = new Intent(UserUpisScreen.this, PhotoScreen.class);
														i.putExtra("mediaPath", mediaDir + nome_upi);
														UserUpisScreen.this.startActivity(i);
													}
												}else{
													Toast.makeText(getApplicationContext(), "Nao foi possivel baixar o arquivo", Toast.LENGTH_SHORT).show();
												}
											}
											
										}.execute();
									}
								}
							});
							adb.show();
						}
				
					});
				}
			}
		}.execute();
		
	}
	
}
